/*
 * estacionVerificacion.cpp
 *
 *  Created on: Oct 16, 2013
 *      Author: m
 */

#include <iostream>
#include <cstdlib>
#include <set>
#include <ctime>
#include <fstream>
#include "DefinicionesComunes.h"
#include "CPrinter.h"
#include "Sequence.h"
#include "NewMessageQueue.h"
#include "NewSemaphore.h"
#include "NewSharedMemory.h"

bool equipajeEsSospechoso( MensajeEquipaje equipaje );

using namespace ipc;

int main( int argc, char* argv[] )
{
    int id;

    srand (time(NULL));

    /*
     * Obtengo el ID de la estacion de verificacion
     */
    id = Sequence::get( IPC_BASE_FILE, SEQ_ID_EST_VERIF ).getNext();

    /*
     * Inicializo el CPrinter
     */
    CPrinter::setHeader( "EST. VERIF", id );

    // Accedo a los IPCs
    MessageQueue<MensajeEquipaje> cintaEquipajeSinVerificar =
            MessageQueue<MensajeEquipaje>::get( IPC_BASE_FILE, MQ_SIN_VERIF );
    MessageQueue<MensajeEquipaje> cintaEquipajeSospechoso =
            MessageQueue<MensajeEquipaje>::get( IPC_BASE_FILE, MQ_SOSPECHOSO );
    MessageQueue<MensajeEquipaje> cintaEquipajeVerificado =
            MessageQueue<MensajeEquipaje>::get( IPC_BASE_FILE, MQ_VERIFICADO );

    CPrinter::printOut( "INICIADO" );

    while( true )
    {
        MensajeEquipaje equipaje;

        equipaje = cintaEquipajeSinVerificar.get( MTYPE_ANY );

        CPrinter::printOut( "Verificando equipaje para el vuelo: %d",
                equipaje.getVuelo() );

        sleep( random() % 10 );

        if ( equipajeEsSospechoso( equipaje ) )
        {
            CPrinter::printOut( "El equipaje es SOSPECHOSO" );

            cintaEquipajeSospechoso.put( equipaje.getVuelo(), equipaje );
        }
        else
        {
            CPrinter::printOut( "El equipaje esta LIMPIO" );

            cintaEquipajeVerificado.put( equipaje.getVuelo(), equipaje );
        }

    }

    return 0;
}

bool equipajeEsSospechoso( MensajeEquipaje equipaje )
{
    static bool elementosSospechososCargados;
    static std::set<std::string> elementosSospechosos;
    bool esSospechoso;

    if ( !elementosSospechososCargados )
    {
        std::ifstream elementosSospechososFile( "elementosSospechosos.txt" );
        std::string buffer;

        while ( getline( elementosSospechososFile, buffer) )
        {
            elementosSospechosos.insert( buffer );
        }

        elementosSospechososCargados = true;
    }

    Equipaje contenido = equipaje.getContenido();

    esSospechoso = false;

    for ( Equipaje::iterator it = contenido.begin();
            it != contenido.end(); it++ )
    {
        if ( elementosSospechosos.find( *it ) != elementosSospechosos.end() )
        {
            esSospechoso = true;
            break;
        }
    }

    return esSospechoso;
}
